{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LOAD PACKAGES!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading package(s)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "print (\"Loading package(s)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PRINT function usages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello, world\n",
      "Integer: 3, 03, 003, 0003, 00003\n",
      "Float: 123, 123.5, 123.46, 123.46, 123.46\n",
      "String: [Hello, world], [Hello, world], [        Hello, world]\n"
     ]
    }
   ],
   "source": [
    "print (\"Hello, world\")\n",
    "\n",
    "# THERE ARE THREE POPULAR TYPES\n",
    "# 1. INTEGER\n",
    "x = 3;\n",
    "print (\"Integer: %01d, %02d, %03d, %04d, %05d\" \n",
    "       % (x, x, x, x, x))\n",
    "# 2. FLOAT\n",
    "x = 123.456;\n",
    "print (\"Float: %.0f, %.1f, %.2f, %1.2f, %2.2f\" \n",
    "       % (x, x, x, x, x))\n",
    "# 3. STRING\n",
    "x = \"Hello, world\"\n",
    "print (\"String: [%s], [%3s], [%20s]\" \n",
    "       % (x, x, x))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# FOR + IF/ELSE "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "We have seen ANN\n",
      "We have seen MLP\n"
     ]
    }
   ],
   "source": [
    "dlmethods = [\"ANN\", \"MLP\", \"CNN\", \"RNN\", \"DAE\"]\n",
    "\n",
    "for alg in dlmethods:\n",
    "    if alg in [\"ANN\", \"MLP\"]:\n",
    "        print (\"We have seen %s\" % (alg))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "dlmethods = [\"ANN\", \"MLP\", \"CNN\", \"RNN\", \"DAE\"];\n",
    "for alg in dlmethods:\n",
    "    if alg in [\"ANN\", \"MLP\", \"CNN\"]:\n",
    "        print (\"%s is a feed-forward network.\" % (alg))\n",
    "    elif alg in [\"RNN\"]:\n",
    "        print (\"%s is a recurrent network.\" % (alg))\n",
    "    else:\n",
    "        print (\"%s is an unsupervised method.\" % (alg))\n",
    "\n",
    "# Little more advanced?\n",
    "print(\"\\nFOR loop with index.\")\n",
    "for alg, i in zip(dlmethods, range(len(dlmethods))):\n",
    "    if alg in [\"ANN\", \"MLP\", \"CNN\"]:\n",
    "        print (\"[%d/%d] %s is a feed-forward network.\" \n",
    "               % (i, len(dlmethods), alg))\n",
    "    elif alg in [\"RNN\"]:\n",
    "        print (\"[%d/%d] %s is a recurrent network.\" \n",
    "               % (i, len(dlmethods), alg))\n",
    "    else:\n",
    "        print (\"[%d/%d] %s is an unsupervised method.\" \n",
    "               % (i, len(dlmethods), alg))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Note that, index starts with 0 ! "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Let's make a function in Python"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10.0 + 20.0 = 30.0\n"
     ]
    }
   ],
   "source": [
    "# Function definition looks like this\n",
    "def sum(a, b):\n",
    "    return a+b\n",
    "X = 10.\n",
    "Y = 20.\n",
    "# Usage \n",
    "print (\"%.1f + %.1f = %.1f\" % (X, Y, sum(X, Y)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# String operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Deep learning is very HARD.\n",
      "Deep learning is very very very HARD.\n",
      "Deep learning is very very very very very very very very very very HARD.\n",
      "\n",
      "==================================================\n",
      "               It is used in this way\n",
      "==================================================\n",
      "\n",
      "Index: [00/12] Char: H\n",
      "Index: [01/12] Char: e\n",
      "Index: [02/12] Char: l\n",
      "Index: [03/12] Char: l\n",
      "Index: [04/12] Char: o\n",
      "Index: [05/12] Char: ,\n",
      "Index: [06/12] Char:  \n",
      "Index: [07/12] Char: w\n",
      "Index: [08/12] Char: o\n",
      "Index: [09/12] Char: r\n",
      "Index: [10/12] Char: l\n",
      "Index: [11/12] Char: d\n"
     ]
    }
   ],
   "source": [
    "head = \"Deep learning\" \n",
    "body = \"very \"\n",
    "tail = \"HARD.\"\n",
    "print (head + \" is \" + body + tail)\n",
    "\n",
    "# Repeat words\n",
    "print (head + \" is \" + body*3 + tail)\n",
    "print (head + \" is \" + body*10 + tail)\n",
    "\n",
    "# It is used in this way\n",
    "print (\"\\n\" + \"=\"*50)\n",
    "print (\" \"*15 + \"It is used in this way\")\n",
    "print (\"=\"*50 + \"\\n\")\n",
    "\n",
    "# Indexing characters in the string\n",
    "x = \"Hello, world\" \n",
    "for i in range(len(x)):\n",
    "    print (\"Index: [%02d/%02d] Char: %s\" \n",
    "           % (i, len(x), x[i])) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "(-2)th char is l\n",
      "String from 0 to 8 is [Hello, w]\n",
      "String from 4 to END is [o, world]\n",
      "[20160607Cloudy] -> [2016] + [0607] + [Cloudy] \n"
     ]
    }
   ],
   "source": [
    "# More indexing \n",
    "print \"\"\n",
    "idx = -2\n",
    "print (\"(%d)th char is %s\" % (idx, x[idx]))\n",
    "idxfr = 0\n",
    "idxto = 8\n",
    "print (\"String from %d to %d is [%s]\" \n",
    "       % (idxfr, idxto, x[idxfr:idxto]))\n",
    "idxfr = 4\n",
    "print (\"String from %d to END is [%s]\" \n",
    "       % (idxfr, x[idxfr:]))\n",
    "x = \"20160607Cloudy\"\n",
    "year = x[:4]\n",
    "day = x[4:8]\n",
    "weather = x[8:]\n",
    "print (\"[%s] -> [%s] + [%s] + [%s] \" \n",
    "       % (x, year, day, weather))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LIST "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[]\n",
      "['a']\n",
      "['a', 123]\n",
      "['a', 123, ['a', 'b']]\n",
      "Length of x is 3 \n",
      "[00/03] a\n",
      "[01/03] 123\n",
      "[02/03] ['a', 'b']\n"
     ]
    }
   ],
   "source": [
    "a = []\n",
    "b = [1, 2, 3]\n",
    "c = [\"Hello\", \",\", \"world\"]\n",
    "d = [1, 2, 3, \"x\", \"y\", \"z\"]\n",
    "x = []\n",
    "print x\n",
    "x.append('a')\n",
    "print x\n",
    "x.append(123)\n",
    "print x\n",
    "x.append([\"a\", \"b\"])\n",
    "print x\n",
    "print (\"Length of x is %d \" \n",
    "       % (len(x)))\n",
    "for i in range(len(x)):\n",
    "    print (\"[%02d/%02d] %s\" \n",
    "           % (i, len(x), x[i]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "2\n",
      "3\n",
      "Hello\n"
     ]
    }
   ],
   "source": [
    "z = []\n",
    "z.append(1)\n",
    "z.append(2)\n",
    "z.append(3)\n",
    "z.append('Hello')\n",
    "for i in range(len(z)):\n",
    "    print (z[i])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DICTIONARY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'job': 'Ph.D. Candidate', 'age': 31, 'name': 'Sungjoon'}\n"
     ]
    }
   ],
   "source": [
    "dic = dict()\n",
    "dic[\"name\"] = \"Sungjoon\"\n",
    "dic[\"age\"] = 31\n",
    "dic[\"job\"] = \"Ph.D. Candidate\"\n",
    "\n",
    "print dic"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello, Fred\n",
      "HELLO, FRED!\n"
     ]
    }
   ],
   "source": [
    "class Greeter:\n",
    "\n",
    "    # Constructor\n",
    "    def __init__(self, name):\n",
    "        self.name = name  # Create an instance variable\n",
    "\n",
    "    # Instance method\n",
    "    def greet(self, loud=False):\n",
    "        if loud:\n",
    "            print ('HELLO, %s!' \n",
    "                   % self.name.upper())\n",
    "        else:\n",
    "            print ('Hello, %s' \n",
    "                   % self.name)\n",
    "\n",
    "g = Greeter('Fred')  # Construct an instance of the Greeter class\n",
    "g.greet()            # Call an instance method; prints \"Hello, Fred\"\n",
    "g.greet(loud=True)   # Call an instance method; prints \"HELLO, FRED!\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def print_np(x):\n",
    "    print (\"Type is %s\" % (type(x)))\n",
    "    print (\"Shape is %s\" % (x.shape,))\n",
    "    print (\"Values are: \\n%s\" % (x))\n",
    "    print"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RANK 1 ARRAY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Type is <type 'numpy.ndarray'>\n",
      "Shape is (3,)\n",
      "Values are: \n",
      "[1 2 3]\n",
      "\n",
      "Type is <type 'numpy.ndarray'>\n",
      "Shape is (3,)\n",
      "Values are: \n",
      "[5 2 3]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "x = np.array([1, 2, 3]) # rank 1 array\n",
    "print_np(x)\n",
    "\n",
    "x[0] = 5\n",
    "print_np(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RANK 2 ARRAY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Type is <type 'numpy.ndarray'>\n",
      "Shape is (2, 3)\n",
      "Values are: \n",
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "y = np.array([[1,2,3], [4,5,6]]) \n",
    "print_np(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ZEROS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Type is <type 'numpy.ndarray'>\n",
      "Shape is (3, 2)\n",
      "Values are: \n",
      "[[ 0.  0.]\n",
      " [ 0.  0.]\n",
      " [ 0.  0.]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "a = np.zeros((3, 2))  \n",
    "print_np(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ONES"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Type is <type 'numpy.ndarray'>\n",
      "Shape is (1, 2)\n",
      "Values are: \n",
      "[[ 1.  1.]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "b = np.ones((1, 2))   \n",
    "print_np(b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# IDENTITY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Type is <type 'numpy.ndarray'>\n",
      "Shape is (2, 2)\n",
      "Values are: \n",
      "[[ 1.  0.]\n",
      " [ 0.  1.]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "c = np.eye(2, 2)   \n",
    "print_np(c)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RANDOM (UNIFORM)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Type is <type 'numpy.ndarray'>\n",
      "Shape is (2, 2)\n",
      "Values are: \n",
      "[[ 0.09677829  0.13234216]\n",
      " [ 0.87168847  0.63200027]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "d = np.random.random((2, 2))    \n",
    "print_np(d)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RANDOM (GAUSSIAN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Type is <type 'numpy.ndarray'>\n",
      "Shape is (1, 10)\n",
      "Values are: \n",
      "[[ 1.12732237 -1.50937817 -0.01637454  0.02860102  0.2353765   0.36251934\n",
      "  -1.30868695 -1.16874378  0.8219648  -0.99443059]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "e = np.random.randn(1, 10)    \n",
    "print_np(e)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ARRAY INDEXING"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Create the following rank 2 array with shape (3, 4)\n",
    "# [[ 1  2  3  4]\n",
    "#  [ 5  6  7  8]\n",
    "#  [ 9 10 11 12]]\n",
    "a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])\n",
    "print_np(a)\n",
    "\n",
    "print\n",
    "# Use slicing to pull out the subarray consisting \n",
    "# of the first 2 rows\n",
    "# and columns 1 and 2; b is the following array \n",
    "# of shape (2, 2):\n",
    "# [[2 3]\n",
    "#  [6 7]]\n",
    "b = a[:2, 1:3]\n",
    "print_np(b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# GET ROW"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])\n",
    "print_np(a)\n",
    "\n",
    "row_r1 = a[1, :]    # Rank 1 view of the second row of a  \n",
    "row_r2 = a[1:2, :]  # Rank 2 view of the second row of a\n",
    "row_r3 = a[[1], :]  # Rank 2 view of the second row of a\n",
    "\n",
    "print_np(row_r1)\n",
    "print_np(row_r2)\n",
    "print_np(row_r3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = np.array([[1,2], [3, 4], [5, 6]])\n",
    "print_np(a)\n",
    "\n",
    "# An example of integer array indexing.\n",
    "# The returned array will have shape (3,) and \n",
    "b = a[[0, 1, 2], [0, 1, 0]]\n",
    "print_np(b)\n",
    "\n",
    "# The above example of integer array indexing \n",
    "# is equivalent to this:\n",
    "c = np.array([a[0, 0], a[1, 1], a[2, 0]])\n",
    "print_np(c)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DATATYPES"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x = np.array([1, 2])  # Let numpy choose the datatype\n",
    "y = np.array([1.0, 2.0])  # Let numpy choose the datatype\n",
    "z = np.array([1, 2], dtype=np.int64)  # particular datatype\n",
    "\n",
    "print_np(x)\n",
    "print_np(y)\n",
    "print_np(z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Array math"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  6.   8.]\n",
      " [ 10.  12.]]\n",
      "[[  6.   8.]\n",
      " [ 10.  12.]]\n"
     ]
    }
   ],
   "source": [
    "x = np.array([[1,2],[3,4]], dtype=np.float64)\n",
    "y = np.array([[5,6],[7,8]], dtype=np.float64)\n",
    "\n",
    "# Elementwise sum; both produce the array\n",
    "print x + y\n",
    "print np.add(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-4. -4.]\n",
      " [-4. -4.]]\n",
      "[[-4. -4.]\n",
      " [-4. -4.]]\n"
     ]
    }
   ],
   "source": [
    "#  Elementwise difference; both produce the array\n",
    "print x - y\n",
    "print np.subtract(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  5.  12.]\n",
      " [ 21.  32.]]\n",
      "[[  5.  12.]\n",
      " [ 21.  32.]]\n"
     ]
    }
   ],
   "source": [
    "# Elementwise product; both produce the array\n",
    "print x * y\n",
    "print np.multiply(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.2         0.33333333]\n",
      " [ 0.42857143  0.5       ]]\n",
      "[[ 0.2         0.33333333]\n",
      " [ 0.42857143  0.5       ]]\n"
     ]
    }
   ],
   "source": [
    "# Elementwise division; both produce the array\n",
    "# [[ 0.2         0.33333333]\n",
    "#  [ 0.42857143  0.5       ]]\n",
    "print x / y\n",
    "print np.divide(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1.          1.41421356]\n",
      " [ 1.73205081  2.        ]]\n"
     ]
    }
   ],
   "source": [
    "# Elementwise square root; produces the array\n",
    "# [[ 1.          1.41421356]\n",
    "#  [ 1.73205081  2.        ]]\n",
    "print np.sqrt(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "x = np.array([[1,2],[3,4]])\n",
    "y = np.array([[5,6],[7,8]])\n",
    "v = np.array([9,10])\n",
    "w = np.array([11, 12])\n",
    "\n",
    "print_np(x)\n",
    "print_np(y)\n",
    "print_np(v)\n",
    "print_np(w)\n",
    "\n",
    "# Inner product of vectors; both produce 219\n",
    "print v.dot(w)\n",
    "print np.dot(v, w) # <= v * w'\n",
    "# Matrix / vector product; both produce the rank 1 array [29 67]\n",
    "print x.dot(v)\n",
    "print np.dot(x, v) # <= x * v'\n",
    "# Matrix / matrix product; both produce the rank 2 array\n",
    "# [[19 22]\n",
    "#  [43 50]]\n",
    "print x.dot(y)\n",
    "print np.dot(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x = np.array([[1,2],[3,4]])\n",
    "print_np(x)\n",
    "print\n",
    "print x\n",
    "print x.T\n",
    "print np.sum(x)  # Compute sum of all elements\n",
    "print np.sum(x, axis=0)  # Compute sum of each column\n",
    "print np.sum(x, axis=1)  # Compute sum of each row"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "print x\n",
    "print x.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "v = np.array([1,2,3])\n",
    "print v \n",
    "print v.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "v = np.array([[1,2,3]])\n",
    "print v \n",
    "print v.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Other useful operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# We will add the vector v to each row of the matrix x,\n",
    "# storing the result in the matrix y\n",
    "x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])\n",
    "v = np.array([1, 0, 1])\n",
    "y = np.empty_like(x)    # Create an empty matrix \n",
    "                        # with the same shape as x\n",
    "\n",
    "print_np(x)\n",
    "print_np(v)\n",
    "print_np(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Add the vector v to each row of the matrix x \n",
    "# with an explicit loop\n",
    "for i in range(4):\n",
    "    y[i, :] = x[i, :] + v\n",
    "print_np(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "vv = np.tile(v, (4, 1))  # Stack 4 copies of v on top of each other\n",
    "print_np(vv)             # Prints \"[[1 0 1]\n",
    "                         #          [1 0 1]\n",
    "                         #          [1 0 1]\n",
    "                         #          [1 0 1]]\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# We will add the vector v to each row of the matrix x,\n",
    "# storing the result in the matrix y\n",
    "x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])\n",
    "v = np.array([1, 0, 1])\n",
    "y = x + v  # Add v to each row of x using BROADCASTING\n",
    "print_np(x)\n",
    "print_np(v)\n",
    "print_np(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Add a vector to each row of a matrix\n",
    "x = np.array([[1,2,3], [4,5,6]])\n",
    "\n",
    "print_np(x)\n",
    "print_np(v)\n",
    "print x + v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# Add a vector to each column of a matrix\n",
    "print_np(x)\n",
    "print_np(w)\n",
    "print (x.T + w).T\n",
    "\n",
    "# Another solution is to reshape w \n",
    "# to be a row vector of shape (2, 1);\n",
    "print\n",
    "print x + np.reshape(w, (2, 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f7bc21b91d0>]"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\niIiIiEgg/X8yZOyHNFXn6AAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7bc228e9d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Compute the x and y coordinates for points on a sine curve\n",
    "x = np.arange(0, 3 * np.pi, 0.1)\n",
    "y = np.sin(x)\n",
    "\n",
    "# Plot the points using matplotlib\n",
    "plt.plot(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7bc2195190>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_sin = np.sin(x)\n",
    "y_cos = np.cos(x)\n",
    "# Plot the points using matplotlib\n",
    "plt.plot(x, y_sin)\n",
    "plt.plot(x, y_cos)\n",
    "plt.xlabel('x axis label')\n",
    "plt.ylabel('y axis label')\n",
    "plt.title('Sine and Cosine')\n",
    "plt.legend(['Sine', 'Cosine'])\n",
    "\n",
    "# Show the figure.\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\noQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7bc2169d10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# Compute the x and y coordinates for points \n",
    "# on sine and cosine curves\n",
    "x = np.arange(0, 3 * np.pi, 0.1)\n",
    "y_sin = np.sin(x)\n",
    "y_cos = np.cos(x)\n",
    "\n",
    "# Set up a subplot grid that has height 2 and width 1,\n",
    "# and set the first such subplot as active.\n",
    "plt.subplot(2, 1, 1)\n",
    "\n",
    "# Make the first plot\n",
    "plt.plot(x, y_sin)\n",
    "plt.title('Sine')\n",
    "\n",
    "# Set the second subplot as active, and make the second plot.\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(x, y_cos)\n",
    "plt.title('Cosine')\n",
    "\n",
    "# Show the figure.\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
